#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
//int Add(int x, int y)
//{
//	return x + y;
//}
//int Sub(int x, int y)
//{
//	return x-y;
//}
//int Mul(int x, int y)
//{
//	return x * y;
//}
//int Div(int x, int y)
//{
//	return x / y;
//}
//int main()
//{
//	int (*pf1)(int, int) = Add;
//	int (*pf2)(int, int) = Sub;
//	int (*pf3)(int, int) = Mul;
//	int (*pf4)(int, int) = Div;
//	int ret1 = pf1(4, 5);
//	int ret2 = pf2(3, 8);
//	int ret3 = pf3(8, 4);
//	int ret4 = pf4(4, 2);
//	printf("%d %d %d %d\n", ret1, ret2,ret3,ret4);
//
//	int (*fun[4])(int, int) = { pf1,pf2,pf3,pf4 };
//	int i = 0;
//	for (i = 0; i < 4; i++)
//	{
//		int ret5 = fun[i](1, 3);
//		printf("%d\n", ret5);
//	}
//	return 0;
//}

//实现计算器，加减乘除
//#include<stdio.h>
//int Add(int x, int y)
//{
//	return x + y;
//}
//int Sub(int x, int y)
//{
//	return x-y;
//}
//int Mul(int x, int y)
//{
//	return x * y;
//}
//int Div(int x, int y)
//{
//	return x / y;
//}
//
//void Menu()
//{
//	printf("----------------------\n");
//	printf("----1.Add    2.Sub----\n");
//	printf("----3.Mul    4.Div----\n");
//	printf("-------- 0.Exit ------\n");
//	printf("----------------------\n");
//}
//int main()
//{
//	int input = 0;
//	int x = 0;
//	int y = 0;
//	int ret = 0;
//	do 
//	{
//		Menu();
//		printf("请选择：");
//		scanf("%d", &input);
//		switch (input)
//		{
//		case 1:
//			printf("请输入两个操作数：");
//			scanf("%d %d", &x, &y);
//			ret = Add(x, y);
//			printf("%d\n", ret);
//			break;
//		case 2:
//			printf("请输入两个操作数：");
//			scanf("%d %d", &x, &y);
//			ret = Sub(x, y);
//			printf("%d\n", ret);
//			break;
//		case 3:
//			printf("请输入两个操作数：");
//			scanf("%d %d", &x, &y);
//			ret = Mul(x, y);
//			printf("%d\n", ret);
//			break;
//		case 4:
//			printf("请输入两个操作数：");
//			scanf("%d %d", &x, &y);
//			ret = Div(x, y);
//			printf("%d\n", ret);
//			break;
//		case 0:
//			printf("退出计算器\n");
//			break;
//		default:
//			printf("选择错误，请重新选择\n");
//			break;
//		}
//	} while (input);
//	
//	return 0;
//}


//函数指针--->转移表
//#include<stdio.h>
//int Add(int x, int y)
//{
//	return x + y;
//}
//int Sub(int x, int y)
//{
//	return x - y;
//}
//int Mul(int x, int y)
//{
//	return x * y;
//}
//int Div(int x, int y)
//{
//	return x / y;
//}
//
//void Menu()
//{
//	printf("----------------------\n");
//	printf("----1.Add    2.Sub----\n");
//	printf("----3.Mul    4.Div----\n");
//	printf("-------- 0.Exit ------\n");
//	printf("----------------------\n");
//}
//int main()
//{
//	int input = 0;
//	int x = 0;
//	int y = 0;
//	int ret = 0;
//	int (*parr[5])(int, int) = { 0,Add,Sub,Mul,Div };
//	//                           0  1   2   3   4 
//	do
//	{
//		Menu();
//		printf("请选择：");
//		scanf("%d", &input);
//		if (input >= 1 && input <= 4)
//		{
//			printf("请输入两个操作数:");
//			scanf("%d %d", &x, &y);
//			ret = parr[input](x, y);
//			printf("%d\n", ret);
//		}
//		else if (input == 0)
//			printf("退出计算器\n");
//		else
//			printf("选择错误，请重新选择：\n");
//	} while (input);
//	return 0;
//}


//回调函数   回调函数就是⼀个通过函数指针调⽤的函数。 如果你把函数的指针（地址）作为参数传递给另⼀个函数，
// 当这个指针被⽤来调⽤其所指向的函数 时，被调⽤的函数就是回调函数。
// 回调函数不是由该函数的实现⽅直接调⽤，⽽是在特定的事件或条件发生时由另外一方调用的，用于对该事件或条件进行响应
#include<stdio.h>
int Add(int x, int y)
{
	return x + y;
}
int Sub(int x, int y)
{
	return x-y;
}
int Mul(int x, int y)
{
	return x * y;
}
int Div(int x, int y)
{
	return x / y;
}

void Menu()
{
	printf("----------------------\n");
	printf("----1.Add    2.Sub----\n");
	printf("----3.Mul    4.Div----\n");
	printf("-------- 0.Exit ------\n");
	printf("----------------------\n");
}
void Calc(int (*pf)(int, int))
{
	int x = 0;
	int y = 0;
	int ret = 0;
	printf("请输入两个操作数：");
	scanf("%d %d", &x, &y);
	ret = pf(x, y);
	printf("%d\n", ret);
}
int main()
{
	int input = 0;

	do 
	{
		Menu();
		printf("请选择：");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			Calc(Add);
			break;
		case 2:
			Calc(Sub);
			break;
		case 3:
			Calc(Mul);
			break;
		case 4:
			Calc(Div);
			break;
		case 0:
			printf("退出计算器\n");
			break;
		default:
			printf("选择错误，请重新选择\n");
			break;
		}
	} while (input);
	
	return 0;
}